Condition

+ satisfies(existingGraph: Graph): boolean

-----------------

ConditionedGraph

- conditions: List<Condition>
- forceSatisfactionOnAdd: boolean

+ ConditionedGraph(graphName: String)
+ ConditionedGraph(graphName: String, conditions: Collection<Condition>)
+ ConditionedGraph(graphName: String, conditions: Collection<Condition>, forceOnAdd: boolean)
- ConditionedGraph(graph: Graph, conditions: Collection<Condition>)

+ addCondition(condition: Condition): void
+ removeCondition(condition: Condition): void
+ getConditionsList(): List<Condition>
+ forcesOnAdd(): boolean
+ setForceOnAdd(forceSatisfactionOnAdd: boolean): void
+ querySatisfaction(): boolean
+ addPartialGraph(nodes: List<Node>, edges: List<Edge>): boolean
- superAddPartialGraph(nodes: List<Node>, edges: List<Edge>): void
- conditionOther(graph: Graph): ConditionedGraph
+ copy(): ConditionedGraph
+ uniqueCopy(): ConditionedGraph

---------------------------

<<interface>> CommunicationListener

+ setUniqueSubgraphs(subgraphs: ArrayList<Graph>): void
+ setGroups(results: ArrayList<Map<String, CygrouperNode>>): void
+ setPartitionNumbers(results: ArrayList<Map<String, CygrouperNode>>): void

---------------------------

Communicator

- communicator: Communicator
+ groups: ArrayList<Map<String, CygrouperNode>>
+ partitionNumbers: ArrayList<Map<String, CygrouperNode>>
+ uniqueSubgraphs: ArrayList<Graph>

- Communicator()

+ getSingleton(): Communicator
+ setUniqueSubgraphs(subgraphs: ArrayList<Graph>): void
+ setGroups(results: ArrayList<Map<String, CygrouperNode>>): void
+ setPartitionNumbers(results: ArrayList<Map<String, CygrouperNode>>): void

----------------------------

CygrouperAssembler

+ edges: List<CygrouperEdge>
+ map: HashMap<String, ArrayList<String>>

+ CygrouperAssembler(regularEdges: List<Edge>)

+ convertCyfinderEdge(s: String, t: String): void
+ assembleMap(edgeList: List<CygrouperEdge>, map: Map): void
+ assmbleNodes(edgeList: List<CygrouperEdge>, map: Map): void
+ getTree(): Map
- printNodeMap(map: Map): void

----------------------------

CygrouperEdge

+ source: String
+ target: String

+ CygrouperEdge(s: String, t: String)
+ toString(): String

----------------------------

CygrouperNode

+ name: String
+ isVisited: boolean
+ connections: ArrayList<CygrouperNode>
+ group: String
+ kPartiteGroupNumber: int

+ CygrouperNode(name: String)

+ getConnectionsList(): ArrayList<CygrouperNode>
+ toString(): String
+ setGroup(AorB: String): void
+ setPartiteNumber(num: int): void
+ getPartiteNumber(): int
+ isGroup(groupStr: String): boolean
+ getOppositeGroup(): String

---------------------------

CytogrouperMain

+ results: ArrayList<Map<String, CygrouperNode>>
+ listener: CommunicationListener
+ tree: Map

+ CytogrouperMain(subgraphs: List<Graph>, listener: CommunicationListener, partiteNumber, int)

+ BFS(tree: Map): void
+ kPartite(tree: Map, k: int): void

---------------------------

BatchProcessor<T, S>

+ BatchProcessor()

+ processSingular(toProcess: T, processor: Processable<T, S>): ArrayList<S>
+ processMultiple(toProcess: T[], processor: Processable<T, S>): ArrayList<ArrayList<S>>

---------------------------

<<interface>> Processable<T, S>

+ process(t: T): ArrayList<S>

---------------------------

Algorithm

+ GraphSortOrder: NONE, ASCENDING, DESCENDING, AVERAGE_WEIGHT

+ listener: CommunicationListener
+ counter: 1
+ args: ArgumentsBundle
- mPCS: PropertyChangeSupport
- progress: double
- partiteNumber: int
- sortOrder: GraphSortOrder

+ Algorithm(args: ArgumentsBundle)

+ setGraphSortOrder(gso: GraphSortOrder): void
+ getGraphSortOrder(): GraphSortOrder
+ setPartiteNumber(partiteNumber: int): void
+ getPartiteNumber(): int

# cull(subGraphs: ArrayList<Graph): ArrayList<Graph>
- compare(base: Graph, match: Graph): boolean
# setProgress(progress: double): void
+ addPropertyChangeListener(pcl: PropertyChangeListener): void
+ removePropertyChangeListener(pcl: PropertyChangeListener): void

------------------------------

BreadthFirstTraversalSearch

+ BreadthFirstTraversalSearch(bundle: ArgumentsBundle)

+ process(graph: Graph): ArrayList<Graph>
- searchNode(graph: Graph, node: Node): Graph

------------------------------

DepthFirstTraversalSearch

+ DepthFirstTraversalSearch(bundle: ArgumentsBundle)

+ process(graph: Graph): ArrayList<Graph>
- searchNode(graph: Graph, node: Node): Graph

------------------------------

Bundle

- algorithms: Algorithm[]
- done: int

+ Bundle(algorithms: Algorithm[])
+ process(graph: Graph): ArrayList<Graph>
+ propertyChange(evt: PropertyChangeEvent): void

------------------------------

<<interface>> GraphReader

+ parseGraph(source: File, undirected: boolean): Graph

------------------------------

<<interface>> GraphWriter

+ writeGraph(toWrite: Graph): void

------------------------------

SimpleGraphIO

+ SimpleGraphIO()

+ parseGraph(source: File, undirected: boolean): Graph
+ writeGraph(toWrite: Graph): void
- testFile(file: File): boolean